home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d20
/
doorskl3.arc
/
DOORSKL5.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-01-15
|
9KB
|
265 lines
#ifndef __TURBOC__
#include <memory.h>
#else
#include <mem.h>
#endif
#include "doorskel.h"
/* This module contains CRC routines for implementing file transfer
protocols or hash tables. Omit module if you don't need them. */
/* Callable routines: */
int _pascal calcrc (char *ptrr, int count, int likexmodem); /* 16 bit */
long _fastcall crc32blk (char *str,int blklen); /* 32 bit */
long _fastcall crc32str(char *str);
/* First 16 bit CRC's (calculated) */
#ifndef __TURBOC__
#pragma optimize("eg",off)
int _pascal calcrc (char *ptrr, int count, int likexmodem) {
/* This function calculates the CRC used by the XMODEM/CRC Protocol
The first argument is a pointer to the message block.
The second argument is the number of bytes in the message block.
The function returns an integer which contains the CRC.
The low order 16 bits are the coefficients of the CRC. */
unsigned int crc;
char temp;
crc = 0;
while(count--) {
temp = *ptrr;
_asm {
MOV DX,[crc]
XOR DH,BYTE PTR[temp] ;init X^16 term
XOR DL,DL
MOV CX,8
CRCUP1: SHL DX,1
JNC CRCUP2
XOR DX,1021h ;X^12 + X^5 + 1
CRCUP2: LOOP CRCUP1
XOR DH,BYTE PTR[crc] ;finish X^16 term
MOV [crc],DX ;update CRC accumulator
}
ptrr++;
}
if(likexmodem) {
_asm { ;swap bytes
MOV DX,[crc]
XCHG DH,DL
MOV [crc],DX
}
}
return crc;
}
#pragma optimize("eg",on)
#else
/*
This code will calculate a 16-bit CRC. crc_update() returns an
updated CRC value given a current CRC value and a character.
crc_finish() must be called once after all characters in a block
have been processed for a message to be _transmitted_ and returns
the calculated CRC which should be transmitted as the final 2
bytes of the character block.
e.g. crc_value = 0; // initialize CRC
crc_value = crc_update( crc_value, ch);
.
.
crc_value = crc_finish( crc_value);
_bits will contain the character to be processed in bits 0-7 and
the CRC in bits 8-23. Bit 24 is used to test for overflow.
The value generated is the CCITT-recommended CRC generator of
x^16 + x^12 + x^5 + 1. To produce a standard IBM synchronous
transmission protocol CRC, use #define XOR 0x01800500l, giving
x^16 + x^15 + x^2 + 1.
*/
#define XOR 0x01102100l
int crc_update (int crc,char crc_char) {
long bits;
short index;
bits = ((long)crc << 8)+crc_char;
for(index = 0;index < 8;index++){
bits <<= 1;
if(bits & 0x01000000l) bits^=XOR;
}
return((int)((bits & 0x00ffff00l) >> 8));
}
int crc_finish (int crc){
return(crc_update(crc_update(crc,'\0'),'\0'));
}
int _pascal calcrc (char *ptrr, int count, int likexmodem) {
unsigned int crc;
char temp;
crc = 0;
count++;
while(--count) {
temp = *ptrr;
crc = crc_update(crc,temp);
ptrr++;
}
crc = crc_finish(crc);
if(likexmodem) swab((char *)&crc,(char *)&count,sizeof(int));
else return crc;
return count;
}
#endif
/* Now 32 bit CRC's table-driven */
long cr3tab[] = { /* CRC polynomial 0xEDB88320 */
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};
/*-------------------------------------------------------------------------*/
/* Calculate CRC-32 of variable length string */
/*-------------------------------------------------------------------------*/
/* */
/* Usage: Passed pointer to ASCIIZ string to take CRC-32 of, as 'str'. */
/* */
/* Rets: (long) CRC-32 value of passed string. */
/* */
/* Notes: The function treats the passed string as UPPER CASE so */
/* it is insensitive to case. */
/* */
/*-------------------------------------------------------------------------*/
long _fastcall crc32str (char *str) {
long crc = -1L;
while(*str) {
crc = cr3tab[((int)crc ^ toupper(*str)) & 0xff] ^ ((crc >> 8) & 0x00FFFFFF);
str++;
}
return crc;
}
/*-------------------------------------------------------------------------*/
/* Calculate CRC-32 of memory block */
/*-------------------------------------------------------------------------*/
/* */
/* Usage: Passed pointer to memory block (cast to char *) as 'str' and */
/* block length as int 'blklen'. */
/* */
/* Rets: (long) CRC-32 value of passed block. */
/* */
/*-------------------------------------------------------------------------*/
long _fastcall crc32blk (char *str,int blklen) {
long crc = -1L;
while(blklen--) {
crc = cr3tab[((int)crc ^ *str) & 0xff] ^ ((crc >> 8) & 0x00FFFFFF);
str++;
}
return crc;
}